import sys
from PySide6.QtWidgets import QApplication, QPushButton, QProgressDialog, QVBoxLayout, QWidget, QDialog
from PySide6.QtCore import Qt, QCoreApplication, Slot
import time

class ProgressApp(QDialog):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Progress Dialog Example')
        self.setGeometry(100, 100, 300, 200)

        layout = QVBoxLayout()

        # 创建一个按钮来启动进度对话框
        self.startButton = QPushButton('Start Long Task', self)
        self.startButton.clicked.connect(self.startLongTask)
        layout.addWidget(self.startButton)

        self.setLayout(layout)

    @Slot()
    def startLongTask(self):
        # 创建进度对话框，设置为无限制模式（不设置取消按钮）
        self.progressDialog = QProgressDialog("Performing long task...", None, 0, 0, self)
        self.progressDialog.setWindowModality(Qt.WindowModality.WindowModal)  # 设置模态，防止用户与主窗口交互直到任务完成
        self.progressDialog.setWindowFlag(Qt.WindowType.WindowCloseButtonHint, False)
        self.progressDialog.setCancelButton(None)  # 移除取消按钮（如果要禁用取消功能）
        self.progressDialog.setWindowTitle("Progress")
        self.progressDialog.show()  # 显示进度对话框，但不设置最大值（表示无限期进行）

        # 模拟长时间运行的任务
        for i in range(100):  # 可以替换为实际的任务执行代码
            time.sleep(0.1)  # 模拟耗时操作
            # self.progressDialog.setValue(i)  # 更新进度条的值（如果需要的话，否则可以省略）
            QCoreApplication.processEvents()  # 处理GUI事件，确保进度条可以更新显示

        self.progressDialog.close()  # 任务完成后关闭进度对话框


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ProgressApp()
    ex.show()
    sys.exit(app.exec())